/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [FileListUtil.java]
 * Creation Date        [07-Jul-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_09_io.utility;

import java.io.File;
import java.io.FilenameFilter;

/**
 * 列出文件工具
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class FileListUtil {

	/**
	 * 这是一个内部类, 实现了FilenameFilter接口, 用于过滤文件
	 */
	static class MyFilenameFilter implements FilenameFilter {
		// 文件名后缀
		private String suffix = "";

		public MyFilenameFilter(String surfix) {
			suffix = surfix;
		}

		@Override
		public boolean accept(File dir, String name) {
			// 如果文件名以suffix指定的后缀相同, 便返回true, 否则返回false
			if (new File(dir, name).isFile()) {
				return name.endsWith(suffix);
			} else {
				// 如果是文件夹, 则直接返回true
				return true;
			}
		}
	}

	/**
	 * 列出目录下所有文件包括子目录的文件路径
	 * 
	 * @param dirName
	 *            文件夹的文件路径
	 */
	public static void listAllFiles(String dirName) {

		// 如果dir不以文件分隔符结尾, 自动添加文件分隔符
		if (!dirName.endsWith(File.separator)) {
			dirName = dirName + File.separator;
		}
		File dirFile = new File(dirName);
		// 如果dir对应的文件不存在, 或者不是一个文件夹, 则退出
		if (!dirFile.exists() || (!dirFile.isDirectory())) {
			System.out.println("List失败!找不到目录: " + dirName);
			return;
		}
		// 列出源文件夹下所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				System.out.println(files[i].getAbsolutePath() + " 是文件!");
			} else if (files[i].isDirectory()) {
				System.out.println(files[i].getAbsolutePath() + " 是目录!");
				FileListUtil.listAllFiles(files[i].getAbsolutePath());
			}
		}
	}

	/**
	 * 列出目录中通过文件名过滤器过滤后的文件
	 * 
	 * @param filter
	 *            文件名过滤器对象
	 * @param dirName
	 *            目录名
	 */
	public static void listFilesByFilenameFilter(String suffix, String dirName) {

		FilenameFilter filter = new MyFilenameFilter(suffix);

		// 如果dir不以文件分隔符结尾, 自动添加文件分隔符
		if (!dirName.endsWith(File.separator)) {
			dirName = dirName + File.separator;
		}

		File dirFile = new File(dirName);
		// 如果dir对应的文件不存在, 或者不是一个文件夹, 则退出
		if (!dirFile.exists() || (!dirFile.isDirectory())) {
			System.out.println("List失败!找不到目录: " + dirName);
			return;
		}
		// 列出源文件夹下所有文件(包括子目录)
		File[] files = dirFile.listFiles(filter);
		for (int i = 0; i < files.length; i++) {
			if (files[i].isFile()) {
				System.out.println(files[i].getAbsolutePath() + " 是文件!");
			} else if (files[i].isDirectory()) {
				System.out.println(files[i].getAbsolutePath() + " 是目录!");
				FileListUtil.listFilesByFilenameFilter(suffix,
						files[i].getAbsolutePath());
			}
		}
	}
}
